package com.hyper_yang.javase.reflection_annotation.field;

import org.junit.jupiter.api.Test;

import java.lang.reflect.Field;

/*
通过反射操作类的属性
 */
public class FieldTest {

    @Test
    public void test() throws ClassNotFoundException {
        // todo: 获取类的属性
        // 1. 获取类对象
        Class<?> studentClass = Class.forName("com.hyper_yang.reflection_annotation.field.Student");

        // 2. 获取类中的所有属性
        // getFields 获取所有公开的属性 包括 super
        // getDeclaredFields 获取类自身所有的属性 不包括父类的
        for (Field field : studentClass.getDeclaredFields()) {
            System.out.println(field);
        }
    }

    @Test
    public void testOperate() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {
        // todo: 操作类的属性
        Class<?> studentClass = Class.forName("com.hyper_yang.reflection_annotation.field.Student");
        // 获取单个属性
        // todo: 操作类的公开普通操作
        // getField 只能拿到公开的
        Field score = studentClass.getField("score");
        // 对属性赋值   普通属性的赋值必须要通过对象
        Object stu = studentClass.newInstance();
        score.set(stu, 99.5);
        Object object = score.get(stu);
        System.out.println(object);
    }

    @Test
    public void testOperate2() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
        // todo: 操作类的受保护的属性
        Class<?> studentClass = Class.forName("com.hyper_yang.reflection_annotation.field.Student");
        // 获取非公开属性
        Field gender = studentClass.getDeclaredField("gender");
        // gender 是普通属性 not static 需要创建类的实例化对象
        Object stu = studentClass.newInstance();
        gender.set(stu, '男');
        // 获取属性 输出
        System.out.println(gender.get(stu));
    }

    @Test
    public void testOperate3() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        // todo: 操作类的私有静态属性
        Class<?> studentClass = Class.forName("com.hyper_yang.reflection_annotation.field.Student");
        // 获取类的私有静态属性
        Field age = studentClass.getDeclaredField("age");
        System.out.println(age);

        age.setAccessible(true);
        // 对静态属性做赋值    不需要有对象
        age.set(null, 18);

        Object object = age.get(null);
        System.out.println(object);
    }
}
